#include <iostream>
#include <string>
#include <regex>

int main()
{
    // HTTP请求行格式： GET /pupu's_blog/login?user=pupu&passwd=12312 HTTP/1.1\r\n
    std::string str = "GET /pupu's_blog/login?user=pupu&passwd=12312 HTTP/1.1";
    // std::string str = "GET /pupu's_blog/login HTTP/1.1";

    std::smatch matches;
    // 请求方法的匹配:GET HEAD POST PUT DELETE，表示匹配并提取其中任意一个字符串
    // [^?] 表示匹配一个非?字符，加*代表匹配一次或多次
    // \\?(.*) \\?表示原始的？字符，后边的(.*)表示提取?之后的任意字符0次或多次，直到遇到空格
    // HTTP/1\\.[01] : [01]表示匹配的是里边的01任意一个字符
    // (?:\n|\r\n)? : (?: ...) 表示匹配某个格式字符串，但是不提取他，最后的?表示的是匹配前边的表达式0次或1次

    std::regex e("(GET|HEAD|POST|PUT|DELETE) ([^?]*)(?:\\?(.*))? (HTTP/1\\.[01])(?:\n|\r\n)?");
    bool ret = std::regex_match(str, matches, e);
    if (ret == false)
    {
        return -1;
    }
    for (int i = 0; i < matches.size(); i++)
    {
        std::cout << i << " : " << matches[i] << std::endl;
    }
    return 0;
}
